// 这个仓库 专门用于存放用户相关的数据
import { reqLogin, reqGetProfile, reqGetBaseInfo } from '@/api/user'
import { setToken, getToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'
const state = {
  // 提供数据
  // 仓库中的token默认从本地cookie获取, 如果获取不到, 则为空
  token: getToken() || '',
  // 用户基本信息对象
  userInfo: {}
}
const mutations = {
  // 提供一个修改token 的mutation
  setToken(state, newToken) {
    // token存仓库(?)
    state.token = newToken
    // token存本地(?)
    setToken(newToken)
  },
  removeToken() {
    state.token = ''
    removeToken()
  },

  setUserInfo(state, newUserInfo) {
    state.userInfo = newUserInfo
  },
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
// 可以封装异步的操作
const actions = {
  // 提供一个用于登录的action
  async  login(context, obj) {
    // 1. login 函数一调用, 一定返回一个promise!!!
    // 2. login函数调用得到的promise 一定是在登录请求成功  以后成功!!!
    // 3. login函数调用得到的promise 一定是在登录请求失败  以后失败!!!

    // 这是一个整体的操作
    // return new Promise((resolve, reject) => {
    //   // 问题在 reqLogin这个登录请求, 竟然在密码填错(请求成功但是操作失败), 帮我返回一个成功的promise

    //   reqLogin(obj)
    //     .then(res => {
    //       // 请求成功
    //       console.log(res, 34)

    //       context.commit('setToken', res.data)
    //       resolve(res)
    //     })
    //     .catch((err) => {
    //       // 请求失败会执行
    //       // console.log(err)
    //       reject(err)
    //     })
    // })
    // const res = await reqLogin(obj)
    // console.log(res.data.data)
    // context.commit('setToken', res.data.data)
    const res = await reqLogin(obj)
    context.commit('setToken', res.data)
    return res
  },
  // 提供一个用于获取用户节本资料的action
  // getUserInfo(context) {
  //   // ---------------------
  //   return new Promise((resolve, reject) => {
  //     reqGetProfile().then(res => {
  //       // console.log(res)
  //       context.commit('serUserInfo', res.data)
  //       resolve(res)
  //     }).catch((err) => {
  //       reject(err)
  //     })
  //   })

  //   // -----------------------
  // }

  // 这里已经完成了获取用户信息的封装
  // 1. async函数 默认就是返回promise,他帮你封装了一层promise
  // 2. 在async 函数return 值相当于 promise中resolve(值)
  async getUserInfo(context) {
    const res = await reqGetProfile()
    // console.log(res, '获取用户基本资料')

    // 这里需要等第一个请求结束后, 拿到userId 作为第二次请求的参数
    const res2 = await reqGetBaseInfo(res.data.userId)
    // console.log(res2, '带头像的基本数据')

    // resObj是完整的用户信息
    const resobj = {
      ...res.data,
      ...res2.data
    }

    // console.log(resobj, '登录用户的基本信息')
    context.commit('setUserInfo', resobj)
    return resobj
  },
  // 提供一个用于退出的action, 调用两个mutation
  logout(context) {
    // 2. 移除token信息
    context.commit('removeToken')
    // 1. 移除vuex个人信息
    context.commit('removeUserInfo')

    // 3. 重置路由 (每个人登进来权限是不一样的, 需要在退出时重置成默认的)
    resetRouter()
    // 同步一下vuex中的routes
    // 跨模块提交mutation 需要第三个参数 { root: true } 从全局触发找对应的模块
    // 4. 将vuex中路由信息数组, 也重置
    // 需求: 需要调用 permission 模块中的 setRoutes (mutation)
    context.commit('permission/setRoutes', [], {
      root: true
    })
    // 5. 清除主题色信息
    context.commit('settings/resetTheme', null, { root: true })
  }
}
const getters = {}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}

